package d3_annotation;

import java.lang.reflect.Method;

public class AnnotationDemo04 {
    //目标: 掌握注解的应用场景之一: 模拟Junit框架
    //利用main方法进行模拟,不可能做插件的
    @MyTest
    public void test1(){
        System.out.println("====test1====");
    }

    public void test2(){
        System.out.println("====test2====");
    }
    @MyTest(count =2)
    public void test3(){
        System.out.println("====test3====");
    }

    public void test4(){
        System.out.println("====test4====");
    }

    //2、用方法进行模拟
    public static void main(String[] args) throws Exception {
        AnnotationDemo04 a = new AnnotationDemo04();
        //2.1反射第一步: 先提取这个Class对象
        Class c = AnnotationDemo04.class;
        //2.2提取这个类的全部方法
        Method[] methods = c.getDeclaredMethods();
        //2.3遍历所有的方法
        for (Method method : methods) {
            //2.4看看这个方法上是否有标记。有标记就特殊处理(进行运行)
            if (method.isAnnotationPresent(MyTest.class)){
                //2.5循化->控制运行几次
                //2.6首先先获取这个注解对象
                MyTest myTest = method.getDeclaredAnnotation(MyTest.class);
                int count = myTest.count();
                for (int i = 0; i < count; i++) {
                    //2.7要运行的方法都是属于对象,所以要拿对象来触发执行
                    method.invoke(a);//不需要攻破权限-->测试方法需要公开
                }
            }
        }
    }

}
